<?php

class loja_categoriaModel extends Model{
    protected $tabela = "loja_categoria";
    protected $pkey   = "cod_categoria";
    protected $dados = array(
        
        'cod_categoria' => array(
            'name'    => "Código da categoria",
            'pkey'    => true,
            'ai'      => true,
            'type'    => 'int',
            'size'    => '11',
            'grid'    => true,
            'notnull' => true
         ),
        
        'catnome' => array(
        	'name' 	  => 'Nome da categoria',
        	'type' 	  => 'varchar',
                'size' 	  => '50',
                //'search'  => true,
                'unique'  => array('model' => 'loja/categoria'),
                'grid'    => true,
        	'notnull' => true
        ),

        'cod_pai' => array(
        	'name' 	  => 'Categoria Pai',
        	'notnull' => false,
                'grid'    => true,
                'fkey'    => array(
                    'model'         => 'loja/categoria', 
                    'cardinalidade' => '1n', //nn 1n 11
                    'keys'          => array('cod_categoria', 'catnome')
                )
        )
    );
    
    private function genLista(){
        $lista = $this->selecionar(array(), "", "", "", $orderby = "catnome ASC");
        $menu = array();
        if(!empty($lista)){
            foreach($lista as $arr){
                //$consulta[$arr[$this->pkey]] = $arr;
                $link = "loja/categoria/show/".$arr[$this->pkey]."/".  GetPlainName($arr['catnome']);
                if($arr['cod_pai'] == "") $arr['cod_pai'] = 0;
                $menu[$arr['cod_pai']][$arr[$this->pkey]] = array('link' => $link,'name' => $arr['catnome']);
            }
        }
        return $menu;
    }
    
    public function getHierarqName($cod_cat){
        
        function gera($menu, &$out, $cod_cat){
            
            if(!array_key_exists($cod_cat, $menu)){
                return;
            }
            
            $nome    = $menu[$cod_cat]['catnome'];
            $link = "loja/categoria/show/$cod_cat/".  GetPlainName($nome);
            $cod_pai = $menu[$cod_cat]['cod_pai'];
            gera($menu, $out, $cod_pai);
            $out[$cod_cat] = array('catnome' => $nome, 'link' => $link);
            
        }
        
        //carrega os itens iniciais
        $lista = $this->selecionar();
        if(empty ($lista)) return array();
        
        
        $menu = $out = array();
        foreach($lista as $arr){
            //$consulta[$arr[$this->pkey]] = $arr;
            $link = "loja/categoria/show/".$arr[$this->pkey]."/".  GetPlainName($arr['catnome']);
            if($arr['cod_pai'] == "") $arr['cod_pai'] = 0;
            $menu[$arr[$this->pkey]] = array(
                'link'    => $link,
                'catnome' => $arr['catnome'],
                'cod_pai' => $arr['cod_pai']
            );
        }
        
        gera($menu, $out, $cod_cat);
        return $out;
        
    }

    private function getCategorias($menu, &$lista, $cod_cat){

            //adiciona a categoria atual a lista
            $lista[] = $cod_cat;

            //se uma categoria não tem filhas, retorna
            if(!array_key_exists($cod_cat, $menu)){
                return;
            }

            foreach($menu[$cod_cat] as $cod_atual => $array){
                $this->getCategorias($menu, $lista, $cod_atual);
            }
    }
    
    public function getProdutos ($cod_cat, $limit = 16, $offset = 0){

        $lista = $prods = array();
        $menu  = $this->genLista();
        $this->getCategorias($menu, $lista, $cod_cat);
        if(!empty ($lista)){
            $this->LoadModel("loja/produto/prodcat", 'pcat');
            $this->LoadModel("loja/produto"        , 'prod');
            $prods = $this->pcat->getProdutosPorListaCategoria($lista, $limit = "", $offset = "");
            if(!empty ($prods)){
                return ($this->prod->getListaProdutos($prods, $limit = 5, $offset = 0));
            }
        }
        return $prods;
    }

    public function getDestaques($cod_cat, $limit = 16, $offset = 0){

        $lista = $prods = array();
        $menu  = $this->genLista();
        $this->getCategorias($menu, $lista, $cod_cat);
        if(!empty ($lista)){
            $this->LoadModel("loja/produto/prodcat", 'pcat');
            $this->LoadModel("loja/produto"        , 'prod');
            $prods = $this->pcat->getProdutosPorListaCategoria($lista, $limit = "", $offset = "");
            if(!empty ($prods)){
                return ($this->prod->getListaProdutos($prods, $limit = 5, $offset = 0));
            }
        }
        return $prods;
    }
    /*
     * Gera o menu infinito
     * Recebe o código da categoria a partir da qual o menu será gerado
     */
    public function geraMenu($cod_cat = 0){       

        //gera uma lista com todas as categorias
        $menu = $this->genLista();
        
        //verifica se a categoria existe
        //caso negativo gera o menu do pai
        $saida = array();
        if(!array_key_exists($cod_cat, $menu)){
            $item = $this->getItem($cod_cat);
            if(empty ($item) || empty ($item['cod_pai'])) return;
            $cod_cat = array_keys($item['cod_pai']);
            $cod_cat = array_shift($cod_cat); 
        }

        //verifica se a categoria existe
        //caso negativo gera o menu da categoria mais generica
        if(array_key_exists($cod_cat, $menu)){
            
            //verifica se a categoria tem filhos
            $havechildren = false;
            foreach($menu[$cod_cat] as $cat => $mn){
                if(array_key_exists($cat, $menu)){
                    $havechildren = true;
                    break;
                }
            }
            
            //se categoria nao tem filhos
            //gera o menu da categoria pai
            if(!$havechildren){
                $item = $this->getItem($cod_cat);
                $cod_cat = 0;
                if(!empty ($item)){
                    $cod_cat = ($item['cod_pai'] == "")?array('0' => '0'): array_keys($item['cod_pai']);
                    $cod_cat = array_shift($cod_cat);
                }
                
            }
        }else $cod_cat = 0;
        
        $this->geraMenuInfinito( $menu , $saida, $cod_cat);
        return $saida;
    }
    
    
    private function geraMenuInfinito( array $menuTotal , &$saida, $idPai, $niveis = 2, $nivel = 0 ){
        
        if($niveis == 0) return;
        
        foreach( $menuTotal[$idPai] as $idMenu => $menuItem){
            $saida[$menuItem['name']][$menuItem['name']] = $menuItem['link'];
            if(isset( $menuTotal[$idMenu] ) ){
                $this->geraMenuInfinito( $menuTotal ,$saida[$menuItem['name']],  $idMenu , $niveis - 1, $nivel + 2);
            }
        }
        
    }

}

?>